Bandit Level 20
локальный «сервер» nc, который сразу отправил строку-пароль в сокет и подождал ответ. SUID-клиент suconnect подключился, сверил пароль и вернул пароль следующего уровня. Потоки мы перехватили редиректами.
Разбор по частям команды:
nc -l -p 12345 -q 1 < /etc/bandit_pass/bandit20 > ./p21 &
./suconnect 12345
wait $pid
cat ./p21
1) nc -l -p 12345 -q 1 < ... > ... &
-
nc --- netcat.
-
-l --- слушать входящее TCP-соединение.
-
-p 12345 --- порт прослушивания. Любой >1024.
-
-q 1 --- после конца stdin подождать 1 секунду и выйти. Нужно, чтобы успеть принять ответ от suconnect после того как мы уже «отправили» пароль.
-
< /etc/bandit_pass/bandit20 --- подаёт содержимое файла в stdin nc. То есть при подключении клиент сразу получает строку с паролем bandit20.
-
./p21 --- пишет stdout nc в файл. Туда попадёт ответ сервиса (пароль bandit21).
-
& --- запустить всё это в фоне, чтобы сразу выполнить следующую команду в том же окне.
-
wait $pid --- ждём, пока nc закроет файл. Потом читаем его.
Итого: nc слушает порт 12345, на подключение отправляет строку из файла, ждёт 1 cекунду, при этом всё, что пришло от клиента, пишет в ./p21.
2) ./suconnect 12345
-
Это SUID-бинарь. Он подключается к localhost:12345, читает одну строку, сравнивает с паролем bandit20.
-
Если строка верна, он шлёт обратно пароль bandit21 и закрывает соединение.
-
Из-за SUID проверка выполняется корректно, хотя обычный пользователю файл пароля bandit21 недоступен.
3) cat ./p21
- Печатает то, что nc принял от suconnect и сохранил. Это и есть пароль bandit21.
Вывод:
bandit20@bandit:~$ nc -l -p 12345 -q 1 < /etc/bandit_pass/bandit20 > ./p21 &
./suconnect 12345
wait $pid
cat ./p21
[3] 47
[1] Done nc -l -p 12345 -q 5 < /etc/bandit_pass/bandit20 > /tmp/p21
-bash: ./p21: Permission denied
Read: 0qXahG8ZjOVMN9Ghs7iOWsCfZyXOUbYO
Password matches, sending next password
[3]+ Exit 1 nc -l -p 12345 -q 1 < /etc/bandit_pass/bandit20 > ./p21
EeoULMCra2q0dSkYj561DX7s1CpBuOBt
cat: ./p21: No such file or directory
[2]+ Done ( cat /tmp/in | nc -l 127.0.0.1 12345 | tr -d 'r' | tee /tmp/p21 )